// src/pages 下，所有 model.ts 文件(不区分任何字母大小写)
import { Effect, Reducer, history } from 'umi'
import { loginReq } from '@/service/login'
import { message } from 'antd'
import { setCookie } from '@/utils/cookie'
export interface ILoginState {
  adminname: string
  token: string
  role: number
}
export interface ILoginModel {
  namespace: 'login' // 命名空间写的和 正式定义时一致
  state: ILoginState,
  effects: {
    login: Effect
  },
  reducers: {
    LOGIN: Reducer<ILoginState>
    // 启用 immer 之后
    // LOGIN: ImmerReducer
  }
}
const loginModel: ILoginModel = {
  // 命名空间，指明模块的名称
  namespace: 'login',
  // 登录模块的初始化数据
  state: {
    adminname: '',
    token: '',
    role: 1
  },
  // 处理 异步操作，类似于vue的actions
  effects: {
    // 如何解决异步操作：回调函数，promise，async/await
    // effects 中使用es6的 generator 解决异步操作问题 ，需要配合 yield 解决问题
    // * ===> async    yield ===> await
    *login ({ payload }, { call, put }) {
      // payload 代表就是参数
      // call 代表调用异步操作 ------
      // put 代表触发改变reducer ----- dispatch
      const res = yield call(loginReq, payload)
      console.log(res)
      if (res.code === '10003') {
        message.error('输入信息有误')
        return
      }
      setCookie('adminname', res.data.adminname, 7)
      setCookie('role', res.data.role, 7)
      setCookie('token', res.data.token, 7)
      history.push('/')
      yield put({
        type: 'LOGIN'
      })
    }
  },
  // 修改状态的，类似于vue的mutations
  reducers: {
    Login () {}
  }
}
export default loginModel
